Premiers pas en WebScraping

Introduction à la collecte automatique de données du Web

Léa Christophe (Université Paris 1 Panthéon-Sorbonne, UMR Géographie-cités)

Hugues Pecout (CNRS, UMR Géographie-cités)

featured

Cet article peut être utilisé pour une initiation aux bases de la collecte automatique de données du Web avec R. De nombreux aspects et méthodes de webscraping qui ne sont pas abordés dans ce document sont présenté sur ce site web associé plus complet et approfondie sur le webscraping avec R et Python.

Introduction

Le web scraping, ou extraction de données sur le web, est une technique qui consiste à extraire de manière automatisée des informations à partir de sites web. En d’autres termes, c’est comme si vous utilisiez un robot pour récupérer des données à partir de pages web, plutôt que de le faire manuellement.

En sciences humaines et sociales, le web scraping peut être utilisé pour collecter des données pertinentes sur des sites web, forums, blogs, des réseaux sociaux, ou autres sources en ligne. Cette méthode peut être particulièrement utile pour analyser des tendances, des opinions, des dynamiques… ou tout simplement pour constituer une base de données à partir de plusieurs sources web. L’utilisation de R pour le web scraping permet d’automatiser ces processus et d’analyser les données extraites de manière efficace.

Le Web scraping permet d’extraire des informations spécifiques d’une page web en analysant sa structure HTML et en extrayant uniquement les éléments pertinents. Cette pratique demande ainsi quelques connaissances techniques en matière de web, de langague de balisage HTML et de le CSS, qui permettent respectivement de structurer une page web et de définir l’apparence et la mise en forme des différents éléments du document.

Au delà de présenter le web scraping avec R, cet article aborde dans un premier temps les connaisances indispensables à la mise en place d’une collecte de données automatisée.

Le Web scraping regroupe différentes techniques plus ou moins complexes. Cet article, qui est une inititation à la pratique de la collecte automatique de données présente le cas d’utilisation le plus simple. Pour aller plus loin et se former à des techniques plus avancées, vous pouvez consulter ce support de formation plus détaillé : https://webscraping.gitpages.huma-num.fr/website/

1 Bases techniques

L’extraction automatisé de données du web requiert des prérequis indispensables : certaines connaissances spécifiques liées à la structure d’une page web et une compréhension des principes techniques sous-jacents. Vous devez ainsi acquérir une connaissance du langage HTML (balises) et une familiarité avec le CSS (sélecteurs) pour identifier, cibler et extraire les éléments d’une page web.

1.1 Le langage HTML

Le HTML, acronyme de HyperText Markup Language (langage de balisage hypertexte en français), est un langage informatique utilisé pour structurer et organiser le contenu des pages web.Il utilise une syntaxe basée sur des balises (tags) pour délimiter les différents éléments d’une page.

1.1.1 Les balises

Il n’y a pas de nombre fixe de balises HTML, car de nouvelles balises peuvent être introduites avec les versions futures du langage HTML. Cependant, il existe un ensemble de balises HTML standard définies dans les spécifications du W3C (World Wide Web Consortium1). Pour obtenir la liste la plus à jour des balises HTML, vous pouvez consulter la documentation officielle du W3C.

Chaque balise est entourée des symboles < et > et peut contenir des attributs qui spécifient des propriétés supplémentaires pour l’élément. Si aucune balise n’est obligatoire dans une page HTML, il est de convention d’avoir la structure de base suivante :

<!DOCTYPE html>
<html>
<head>
    <title>Titre de la page</title>
</head>
<body>

    <!-- Contenu de la page -->
    
</body>
</html>
  • <!DOCTYPE html> : En début du document, indique au navigateur qu’il s’agit d’une page HTML52.
  • <html> : Englobe tout le contenu de la page HTML.
  • <head> : Contient les métadonnées de la page, des liens vers des fichiers annexes (CSS, javascript…), etc.
  • <title> : Pour définir le titre de la page qui apparaîtra dans la barre de titre du navigateur.
  • <body> : Contient tout le contenu visible de la page, tel que le texte, les images, les liens, les tableaux, etc.

Dans la majorité des cas, on utilise une balise de fermeture pour indiquer la fin de l’élémént. Une balise de fermeture présente un / avant le nom de la balise :

<body>

    <!-- Contenu de la page -->
    
</body>

Le body peut contenir toute une variété de balises prédéfinies pour structurer et ajouter différents types de contenu dans la page web. Voici quelques balises indispensables à connaitre :

  • <html> : Définit le début et la fin du document HTML.
  • <head> : Contient les métadonnées du document.
  • <title> : Définit le titre du document.
  • <body> : Contient le contenu principal du document.
  • <h1>, <h2>, …, <h6> : Définissent les titres de différents niveaux.
  • <p> : Définit un paragraphe.
  • <a> : Crée un lien hypertexte.
  • <img> : Insère une image.
  • <ul>, <ol>, <li> : Créent des listes non ordonnées et ordonnées.
  • <table>, <tr>, <td> : balises pour créer des tableaux avec des lignes et des cellules de données.
  • <div> : Divise le document en sections ou en groupes de contenu.
  • <span> : Applique des styles à des parties de texte.

Exemple de balise p (paragraphe) :

<body>

<p>Un paragraphe en langage HTML</p>

</body>

Dans cet exemple, la balise <p> représente un paragraphe dont le contenu “Un paragraphe en langage HTML” est placé entre la balise d’ouverture <p> et la balise de fermeture </p>.

1.1.2 Les attributs

Ces balises hiérarchisées et potentiellement regroupées, peuvent être accompagnées d’attributs qui permettent de spécifier des informations supplémentaires et jouer sur leur mise en forme, tels que des identifiants (id), des classes (class), des liens (href), etc. Ces attributs sont à spécifier dans la balise d’ouverture :

<body>

<div id="debut_doc">
    <h1 class="categorie">Tous les articles</h1>
</div>

<div id="Liste_ref">
    <h2 class="article">Titre article</h2>
    <p class="summary">Résumé de l'article...</p>
    <a href="https://www.article.org">Intégralité de l'article</a>
</div>

</body>

L’organisation segmenté du contenu via les balises div ou span ainsi que les différents attributs spécifiés permettent la mise en forme et le paramétrage des éléments. Mais la structure de la page ainsi que les attributs spécifiés sont également des éléments cruciaux pour la collecte automatisée de données sur le web.

Les attributs des balises peuvent être associée à une mise en forme (couleur, taille, position, etc.) à l’aide du langage CSS.


1.2 La langage CSS

Le CSS, ou Cascading Style Sheets (feuilles de style en cascade), est un langage de programmation utilisé pour décrire l’apparence et la mise en forme des documents HTML et XML. Il permet de contrôler l’apparence visuelle des différents éléments de pages web (taille, position, couleur, police, marges, etc.) via les sélecteurs CSS.

Le CSS peut être incorporé de différentes manières :

1. Dans les balises à l’aide de l’attribut style :

<h1 style ="font-size:40px;color:#f03b35;text-align:center;">Titre principal</h1>

2. Dans le document HTML, via la balise <style> adaptée à cet effet :

<style>

h1 {
color: #f03b35;
font-size: 40px;
text-align: center;
}
    
</style>

<body>
<h1>Titre principal</h1>
</body>

3. Dans une feuille de style externe (fichier texte avec l’extension .css). Cette dernière méthode est à privilégier car la séparation du contenu et la mise en forme facilite la mise à jour des styles :

page.html
<body>

<h1>Titre principal</h1>

</body>
style.css
h1 { 
color: #f03b35;
font-size: 40px;
text-align:center;
}

À chaque fois, le rendu graphique sera le suivant :

1.2.1 Les sélecteurs CSS simples

Bien qu’une connaissance approfondie du CSS ne soit pas nécessaire le scraping, il est important de connaître les sélecteurs CSS. Leur utilisation est précieuse pour cibler des données de manière détaillée et ainsi optimiser la collecte.

Plusieurs sélecteurs CSS permettent de cibler et styliser les différentes balises HTML :

1. Les sélecteurs d’éléments : permet de cibler tous les éléments d’un même type.

<h2>Titre de niveau 2</h2>
h2 { font-size: 20px; }


2. Les sélecteurs d’identifiants : permet de cibler un élément spécifique par son identifiant (id).

<div id="example">  </div>
#example { background-color: #f2f2f2; }


3. Les sélecteurs de classes : permet de cibler les éléments ayant une classe spécifique (class).

<p class="summary">Ceci est un résumé</p>
.summary { font-family: Arial, sans-serif; }


4. Les sélecteurs d’attributs : cible les éléments ayant un attribut spécifique. Exemple : l’attribut href (lien cliquable)

<a href="https://www.example.org">Lien</a>
a[href] { color: purple; }

Il est possible de préciser sa cible en indiquant une valeur pour l’attribut.

a[href="https://example.org"] { color: purple;}


1.2.2 Les sélecteurs complexes et combinateurs

Le CSS met également à disposition des sélecteurs complexes et combinateurs que l’on peut utiliser pour cibler des contenus de manière très précise. Quelques exemples :

A. Les sélecteurs descendants : cible les éléments qui sont descendants d’un autre élément.

<div id="liste_ref">

  
    <p class="summary">Ceci est un résumé</p>
    
  
</div>
#liste_ref p .summary { font-size: 12px; }
Cible tous les paragraphes de la classe summary, positionnés dans l’élément ayant pour identifiant liste_ref.


B. Les sélecteurs de voisin direct : cible les nœuds qui suivent immédiatement un élément

<div id="liste_ref">

    <h2>Titre de l'article</h2>
    <p class="summary">Ceci est un résumé</p>
    
    <h2>Titre de l'article</h2>
    <p class="summary">Ceci est un résumé</p>
        
</div>
#liste_ref + h2 { font-size: 14px; }


Cible uniquement la première balise h2 de l’élément ayant pour identifiant liste_ref.


1.3 Le code source d’une page web

La connaissance du HTML et du CSS vous permettra de comprendre et de naviguer dans le code source du page web. L’ensemble des navigateurs web modernes proposent des outils d’inspection du code source des pages web.

L’inspecteur de code source permet d’explorer le code source d’une page web en direct. Il permet l’identification des balises, des classes, des identifiants et des styles associés aux éléments, et ainsi de procéder à une extraction ciblée de données. En utilisant l’inspecteur de code source, vous accédez à toutes les informations nécessaires pour concevoir un script de scraping.

Pour y accéder, cliquez-droit n’importe où sur la page web ciblée, puis cliquez sur “Inspecter” :

Avec Google Chrome :

Avec Mozilla FireFox :


L’inspecteur s’ouvre et en utilisant l’outil de sélection (entouré en rouge), il donne la possibilité de naviguer dans le code source en survolant les différents éléments de la page, et vice versa.


Vous pouvez déplier le code source pour l’explorer en profondeur. Cet article est une page HTML dans laquelle l’ensemble de la partie “2. Bases techniques” semblent contenu dans une div ayant pour identifiant “bases-techniques” :


En réalisant un clic-droit sur un élément, vous pouvez récupérer plusieurs choses. Cliquez sur copier :


Ainsi, vous pouvez récupérer aisément :

  • l’intérieur du HTML (?)
  • l’exterieur du HTML (?)
  • Le sélecteur CSS (ex : #bases-techniques)
  • Le chemin CSS (ex : html body.preload div#content div#main div#bases-techniques.section.level1
  • Le Xpath (ex : //*[@id="bases-techniques"])

Ces trois derniers éléments pourront vous être précieux pour automatiser votre collecte.

Pour cette page, le sélecteur CSS #bases-techniques h2 permet ainsi de cibler tous les titres de niveau 2 présents dans l’élément div ayant pour identifiant “bases-techniques”… Le scraping peut commencer !

Fin de partie à développer !!!


2 Présentation du cas pratique et objectifs

2.1 Site web utilisé pour le scrapping

Nous allons passer à la mise en application à partir du site ScrapImmob. Il compile un ensemble d’annonces immobilières fictives sur plusieurs départements.

Les biens ainsi que leurs images ont été générés par différents modèles d’intelligence artificielle. Toutes les informations que contiennent ce site sont donc fausses.

Dans un premier temps, nous pouvons naviguer sur le site afin de voir les informations qu’il contient. ScapImmob recense des annonces immobilières de maisons ou d’appartements dans dix départements français : l’Essonne, l’Eure, les Hauts-de-Seine, Paris, la Seine-Maritime, la Seine-Saint-Denis, la Seine-et-Marne, le Val d’Oise, le Val de Marne et les Yvelines. Chacune des annonces contient les informations suivantes :

  • des photographies
  • un titre d’annonces
  • une description détaillée
  • les caractéristiques du biens (surfaces, prix, nombre de chambres, etc.)
  • la location avec l’information sur la commune, le département et une zone plus précise.

2.2 Exploration du site web

Pour scrapper, il est important de comprendre comment le site web est construit pour être capacité de cibler les bons élements lors du scrapping. Après avoir navigué sur ScrapImmob dans la partie précédente, nous pouvons donc commencer à explorer son code source. Pour cela, nous allons utiliser l’inspecteur de code expliqué dans la partie sur le code source d’une page web de cette fiche. Pour rappel, c’est à l’aide de l’inspecteur que nous pourrons donc trouver les balises, les classes, les identifiants et les styles associés aux éléments, et ainsi de procéder à une extraction ciblée des informations.

2.3 Objectifs

Avant de commencer à scrapper, il est important de définir nos objectifs et de clarifier les informations que l’on souhaite récupérer. Cela permet de construire un code optimisé récupérant uniquement les élements qui seront utiles à notre analyse. Nous souhaitons obtenir une base de

Définir ses objectifs ! = Présentation du système d’URL

lecture de chaque page de chaque bien Objectifs de ce scraping ?

3 Mise en pratique

3.1 Le package rvest

Pour ce cas pratique, nous allons utilisé le package rvest, développé par Hadley Wickham, qui facilite le scraping en utilisant les sélecteurs CSS et XPath pour extraire les données des pages web.Il existe plusieurs packages permettant de faire du webScraping avec R comme RSelenium. Selon le site que vous souhaitez scraper et les fonctionnalités dont vous avez besoin, il faut choisir le package le plus adapté. Dans notre cas, ScrapImmob est un site statistique et bien structurées donc le package rvest correspond bien à ce type de site web. A l’inverse pour du scraping de pages web dynamiques ou nécessitant une interaction utilisateur, RSelenium aurait été plus adapté.

library(rvest)

3.2 Découvrir les fonctions principales de rvest

3.2.1 Scraping d’un extrait de code html

Commençons à explorer les principales fonctions du package rvest à partir d’un extrait de code html du site ScrapImmob :

#Exemple HTML simple
basic_html <- minimal_html( '<div class="card-body">
                                <a href="annonces/IDF_0078.html" class="stretched-link"></a>
                                <p class="card-text">Maison charmante de 96 m² avec grand jardin à Châtenay-Malabry</p>
                            </div>')
  • Les fonctions read_element ou read_elements permettent la récupération du 1er ou de tous les élements selon leur sélécteur CSS ou Xpath.
#Récupérer les éléments de la balise <p>
basic_html %>% html_elements("p")
{xml_nodeset (1)}
[1] <p class="card-text">Maison charmante de 96 m² avec grand jardin à Châten ...
  • La fonction html_attr permet l’extraction des données des attributs.
#Récupérer l'url indiqué dans l'attribut href
basic_html %>% html_elements("a") %>% html_attr("href")
[1] "annonces/IDF_0078.html"
  • Les fonctions html_text ou html_text2 permettent l’extraction du texte d’un élément
#Récupérer le texte entre les balises
basic_html %>% html_elements("p") %>% html_text2()
[1] "Maison charmante de 96 m² avec grand jardin à Châtenay-Malabry"

3.2.2 Scraping de la première page du site ScrapImmob

Maintenant, nous allons nous exercer sur la première page du site ScrapImmob. Nous récupérons le code de la page à l’aide de la fonction read_html :

#Stockage de l'URL 
urlannonce <- "https://analytics.huma-num.fr/Robin.Cura/ScrapImmob/"

#Lecture de l'URL
page <- read_html(urlannonce)

Notre 1ère objectif est de récupérer les URLs des biens immobiliers de cette première page de ScrapImmob.

#Récupérer les url des biens immobiliers de la 1ère page
page %>% html_elements("div:nth-child(1) > div:nth-child(3) > a:nth-child(1)") %>% html_attr("href")
 [1] "annonces/IDF_0078.html"       "annonces/IDF_0049.html"      
 [3] "annonces/IDF_0057.html"       "annonces/IDF_0200.html"      
 [5] "annonces/Normandie_0255.html" "annonces/IDF_0275.html"      
 [7] "annonces/IDF_0121.html"       "annonces/Normandie_0416.html"
 [9] "annonces/Normandie_0105.html" "annonces/IDF_0134.html"      
[11] "annonces/IDF_0238.html"       "annonces/Normandie_0029.html"
[13] "annonces/Normandie_0011.html" "annonces/IDF_0379.html"      
[15] "annonces/IDF_0287.html"       "annonces/Normandie_0062.html"
[17] "annonces/Normandie_0252.html" "annonces/Normandie_0398.html"

3.2.3 Scraping des URLs de tous les biens immobiliers

#Récupérer les url des biens immobiliers de la 1ère page

extraire_liens <- function(url) {
  page <- read_html(url)
  liens <- page %>% html_elements("div:nth-child(1) > div:nth-child(3) > a:nth-child(1)") %>% html_attr("href")
  return(liens)
} 

#Récupérer le nombre de pages
nombre_de_pages <- 5

# Liste pour stocker tous les liens
liste_de_liens <- list()

#Boucle
for (i in 1:nombre_de_pages) {
  url_page <- paste0(urlannonce, "?page=", i)
  liens_page <- extraire_liens(url_page)
  
  # Faire quelque chose avec les liens extraits (imprimer, stocker, etc.)
  liste_de_liens <- c(liste_de_liens, liens_page)
}

liste_de_liens
[[1]]
[1] "annonces/IDF_0078.html"

[[2]]
[1] "annonces/IDF_0049.html"

[[3]]
[1] "annonces/IDF_0057.html"

[[4]]
[1] "annonces/IDF_0200.html"

[[5]]
[1] "annonces/Normandie_0255.html"

[[6]]
[1] "annonces/IDF_0275.html"

[[7]]
[1] "annonces/IDF_0121.html"

[[8]]
[1] "annonces/Normandie_0416.html"

[[9]]
[1] "annonces/Normandie_0105.html"

[[10]]
[1] "annonces/IDF_0134.html"

[[11]]
[1] "annonces/IDF_0238.html"

[[12]]
[1] "annonces/Normandie_0029.html"

[[13]]
[1] "annonces/Normandie_0011.html"

[[14]]
[1] "annonces/IDF_0379.html"

[[15]]
[1] "annonces/IDF_0287.html"

[[16]]
[1] "annonces/Normandie_0062.html"

[[17]]
[1] "annonces/Normandie_0252.html"

[[18]]
[1] "annonces/Normandie_0398.html"

[[19]]
[1] "annonces/IDF_0078.html"

[[20]]
[1] "annonces/IDF_0049.html"

[[21]]
[1] "annonces/IDF_0057.html"

[[22]]
[1] "annonces/IDF_0200.html"

[[23]]
[1] "annonces/Normandie_0255.html"

[[24]]
[1] "annonces/IDF_0275.html"

[[25]]
[1] "annonces/IDF_0121.html"

[[26]]
[1] "annonces/Normandie_0416.html"

[[27]]
[1] "annonces/Normandie_0105.html"

[[28]]
[1] "annonces/IDF_0134.html"

[[29]]
[1] "annonces/IDF_0238.html"

[[30]]
[1] "annonces/Normandie_0029.html"

[[31]]
[1] "annonces/Normandie_0011.html"

[[32]]
[1] "annonces/IDF_0379.html"

[[33]]
[1] "annonces/IDF_0287.html"

[[34]]
[1] "annonces/Normandie_0062.html"

[[35]]
[1] "annonces/Normandie_0252.html"

[[36]]
[1] "annonces/Normandie_0398.html"

[[37]]
[1] "annonces/IDF_0078.html"

[[38]]
[1] "annonces/IDF_0049.html"

[[39]]
[1] "annonces/IDF_0057.html"

[[40]]
[1] "annonces/IDF_0200.html"

[[41]]
[1] "annonces/Normandie_0255.html"

[[42]]
[1] "annonces/IDF_0275.html"

[[43]]
[1] "annonces/IDF_0121.html"

[[44]]
[1] "annonces/Normandie_0416.html"

[[45]]
[1] "annonces/Normandie_0105.html"

[[46]]
[1] "annonces/IDF_0134.html"

[[47]]
[1] "annonces/IDF_0238.html"

[[48]]
[1] "annonces/Normandie_0029.html"

[[49]]
[1] "annonces/Normandie_0011.html"

[[50]]
[1] "annonces/IDF_0379.html"

[[51]]
[1] "annonces/IDF_0287.html"

[[52]]
[1] "annonces/Normandie_0062.html"

[[53]]
[1] "annonces/Normandie_0252.html"

[[54]]
[1] "annonces/Normandie_0398.html"

[[55]]
[1] "annonces/IDF_0078.html"

[[56]]
[1] "annonces/IDF_0049.html"

[[57]]
[1] "annonces/IDF_0057.html"

[[58]]
[1] "annonces/IDF_0200.html"

[[59]]
[1] "annonces/Normandie_0255.html"

[[60]]
[1] "annonces/IDF_0275.html"

[[61]]
[1] "annonces/IDF_0121.html"

[[62]]
[1] "annonces/Normandie_0416.html"

[[63]]
[1] "annonces/Normandie_0105.html"

[[64]]
[1] "annonces/IDF_0134.html"

[[65]]
[1] "annonces/IDF_0238.html"

[[66]]
[1] "annonces/Normandie_0029.html"

[[67]]
[1] "annonces/Normandie_0011.html"

[[68]]
[1] "annonces/IDF_0379.html"

[[69]]
[1] "annonces/IDF_0287.html"

[[70]]
[1] "annonces/Normandie_0062.html"

[[71]]
[1] "annonces/Normandie_0252.html"

[[72]]
[1] "annonces/Normandie_0398.html"

[[73]]
[1] "annonces/IDF_0078.html"

[[74]]
[1] "annonces/IDF_0049.html"

[[75]]
[1] "annonces/IDF_0057.html"

[[76]]
[1] "annonces/IDF_0200.html"

[[77]]
[1] "annonces/Normandie_0255.html"

[[78]]
[1] "annonces/IDF_0275.html"

[[79]]
[1] "annonces/IDF_0121.html"

[[80]]
[1] "annonces/Normandie_0416.html"

[[81]]
[1] "annonces/Normandie_0105.html"

[[82]]
[1] "annonces/IDF_0134.html"

[[83]]
[1] "annonces/IDF_0238.html"

[[84]]
[1] "annonces/Normandie_0029.html"

[[85]]
[1] "annonces/Normandie_0011.html"

[[86]]
[1] "annonces/IDF_0379.html"

[[87]]
[1] "annonces/IDF_0287.html"

[[88]]
[1] "annonces/Normandie_0062.html"

[[89]]
[1] "annonces/Normandie_0252.html"

[[90]]
[1] "annonces/Normandie_0398.html"

3.2.4 Scraping d’éléments d’une page d’annonce immobilière

Travaillons maintenant sur la 1ère annonce immobilière de cette liste

#Récupérer l'URL de la 1ère annonce
urlannonce1 <- paste0("https://analytics.huma-num.fr/Robin.Cura/ScrapImmob/",liste_de_liens[1])

#Lire la page 
pageannonce1 <- read_html(urlannonce1)

#Récupérer l'élément titre 
pageannonce1 %>% html_element(".display-6") %>% html_text2()
[1] "Maison charmante de 96 m² avec grand jardin à Châtenay-Malabry"
#Récupérer de l'URL de la 1ère image
image_url <- pageannonce1  %>% 
           html_element("img") %>%  # Sélectionner tous les éléments 'img'
  html_attr("src")

3.3 Scraping de la base de données sur Paris

3.3.1 Création de la liste des annonces à scrapper

Nous souhaitons maintenant obtenir une base de données complète des biens immobiliers qui contient un ensemble d’informations sur Paris.Pour ça, il nous faut la liste des urls des biens.

#METTRE ICI LE CODE QUI PERMET DE RECUPERER LA LISTE DES BIENS SUR PARIS 

3.3.2 Fonctions nécessaires au scraping

Nous allons créer un ensemble de fonction qui nous permettent de scrapper ces éléments.

#Fonction d'extraction du titre court 
extraire_titrec <- function(url) {
  titre <- page %>% html_elements(".display-6)") %>% html_text2()
  return(titre)
} 

#Fonction d'extraction du titre long 
extraire_titrel <- function(url) {
  element <- page %>% html_elements("h5.card-title:nth-child(1)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction de la description 
extraire_description <- function(url) {
  element <- page %>% html_elements(".card-text") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du type 
extraire_type <- function(url) {
  element <- page %>% html_elements("ul.list-group > li:nth-child(1) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 


#Fonction d'extraction du nombre de chambres 
extraire_chambres <- function(url) {
  element <- page %>% html_elements("ul.list-group > li:nth-child(2) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du nombre de salle de bains
extraire_chambres <- function(url) {
  element <- page %>% html_elements("li.list-group-item:nth-child(3) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du nombre de la surface habitable
extraire_surf <- function(url) {
  element <- page %>% html_elements("li.list-group-item:nth-child(4) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du nombre de la surface jardin
extraire_surfj <- function(url) {
  element <- page %>% html_elements("li.list-group-item:nth-child(5) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du prix
extraire_prix <- function(url) {
  element <- page %>% html_elements("li.list-group-item:nth-child(6) > strong:nth-child(2)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction de la commune 
extraire_commune <- function(url) {
  element <- page %>% html_elements("div.list-group:nth-child(1) > li:nth-child(1) > strong:nth-child(1)") %>% html_text2()
  return(element)
} 

#Fonction d'extraction du département
extraire_commune <- function(url) {
  element <- page %>% html_elements("div.list-group:nth-child(1) > li:nth-child(2) > strong:nth-child(1)") %>% html_text2()
  return(element)
} 


#Fonction d'extraction de la localisation 
extraire_loc <- function(url){
  element <- 
    page %>% html_elements('script') %>% # On récupère les balises de type script
                      html_text2() %>% # On en extrait le contenu
                      pluck(2) %>% # On ne garde que la 2ème balise string, qui est celle qui contient le code leaflet
                      str_extract(string = .,
                                  pattern = "var annonce_coords = \\[(\\d+\\.?\\d*\\, \\d+\\.?\\d*)\\]", # regexp qui cherche les caractères "var annonce_coords = [unNombreDecimal, unAutreNombreDecimal]" et met les deux nombres décimaux dans un groupe (les parenthèses) -> "49.224678, 1.184296"
                                  group = 1) %>% # On ne conserve que le groupe 1, donc ce qui était en parenthèse dans la regexp 
                      str_split(pattern = ',') %>% # On découpe par la virgule -> list(c("49.224678", " 1.184296"))
                      pluck(1) %>% # str_split crée une liste de vecteurs, on ne garde que le premier élément -> c("49.224678", " 1.184296")
                      str_trim() %>% # sur chaque vecteur, on enlève les espaces en début et en fin -> c("49.224678", "1.184296")
                      as.numeric() # On peut enfin les convertir en numérique, et donc récupérer la latitude puis la longitude (ordre inversé de coordonnées de leaflet)
  return(element)
}

3.3.3 Scraping de la base

Appliquons maintenant les fonctions à la liste de biens pour constituer notre base de données

3.4 Exploration de la base de données scrappées

3.4.1 Présentation de la BD scrapée

3.4.2 Répartition par type

3.4.3 Distribution par type/prix

3.4.4 Surface moyenne

3.4.5 Nuage de mot sur les description des biens

3.4.6 Carte !

Géocodage adresse + carto

3.4.7 Export

3.4.7.1 csv

3.4.7.2 Géopackage

4 Pour aller plus loin

4.1 Rselenium

4.2 Support complet

5 Conclusion

Ouverture Le bon coin ?

Bibliographie

BARNIER, Julien, 2021. rmdformats: HTML Output Formats and Templates for ’rmarkdown’ Documents [en ligne]. S.l. : s.n. Disponible à l'adresse : https://github.com/juba/rmdformats.
R CORE TEAM, 2020. R: A Language and Environment for Statistical Computing [en ligne]. Vienna, Austria : R Foundation for Statistical Computing. Disponible à l'adresse : https://www.R-project.org/.
XIE, Yihui, 2020. knitr: A General-Purpose Package for Dynamic Report Generation in R [en ligne]. S.l. : s.n. Disponible à l'adresse : https://CRAN.R-project.org/package=knitr.

Annexes

Info session

setting value
version R version 4.3.1 (2023-06-16 ucrt)
os Windows 11 x64 (build 22621)
system x86_64, mingw32
ui RTerm
language (EN)
collate French_France.utf8
ctype French_France.utf8
tz Europe/Paris
date 2024-03-25
pandoc 3.1.1 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
package ondiskversion source
rvest 1.0.3 CRAN (R 4.3.2)

Citation

Auteur.e P, Auteur.e S (2021). “Titre de la fiche.” doi:10.48645/xxxxxx, https://doi.org/10.48645/xxxxxx,, https://rzine.fr/publication_rzine/xxxxxxx/.

BibTex :

@Misc{,
  title = {Titre de la fiche},
  subtitle = {Sous-Titre de la fiche},
  author = {Premier Auteur.e and Second Auteur.e},
  doi = {10.48645/xxxxxx},
  url = {https://rzine.fr/publication_rzine/xxxxxxx/},
  keywords = {FOS: Other social sciences},
  language = {fr},
  publisher = {FR2007 CIST},
  year = {2021},
  copyright = {Creative Commons Attribution Share Alike 4.0 International},
}


Glossaire


  1. Le World Wide Web Consortium, abrégé par le sigle W3C, est un organisme de standardisation à but non lucratif, fondé en octobre 1994 chargé de promouvoir la compatibilité des technologies du World Wide Web telles que HTML5, HTML, XHTML, XML, RDF, SPARQL, CSS, XSL, PNG, SVG, MathML et SOAP.↩︎

  2. HTML5 (HyperText Markup Language 5) est la dernière révision majeure du HTML (format de données conçu pour représenter les pages web). Cette version a été finalisée le 28 octobre 2014. HTML5 spécifie deux syntaxes d’un modèle abstrait défini en termes de DOM : HTML5 et XHTML5.↩︎